var sandbox = require('../../../../app/components/backend/util/sandbox');
var assert  = require('assert');
var sinon   = require('sinon');

describe('app/components/backend/util/sandbox', function () {

  // 测试前置处理
  beforeEach(function() {
    this.sinon = sinon.sandbox.create();
  });

  // 测试后置处理
  afterEach(function(){
    this.sinon.restore();
  });

  it('[sandbox.Nor.01].多次require(sandbox),应该得到同一个sandbox实例 ', function () {

    // Require again
    var s1 = require('../../../../app/components/backend/util/sandbox');
    assert.ok(Object.is(sandbox, s1));
  });

  it('[sandbox.Nor.02].监听消息,并触发listener,获得消息携带的对象', function () {

    // 为sinon准备桩对象
    var base = {};
    base.handleM1    = function (data) {

      // 获得消息携带的对象
      assert.ok(data.ok);
    };

    // sinon监视base.handleM1方法
    sinon.spy(base, 'handleM1');
    sandbox.MSG._M1 = 'M1';

    // 注册事件
    sandbox.on(sandbox.MSG._M1, base.handleM1);

    // Require again, 触发事件
    require('../../../../app/components/backend/util/sandbox').emit(sandbox.MSG._M1, {ok: true});

    // 触发listener
    assert.ok(base.handleM1.calledOnce, "消息的listener没有被执行");
  });

  it('[sandbox.Nor.03].sandbox和nodejs系统使用的EventEmitter不是同一个实例 ', function () {

    // Require again
    var systemEE = require('events').EventEmitter;
    assert.ok(!Object.is(sandbox, new systemEE()));
  });
});